// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/shell/app/blink_test_platform_support.h"

#include <iostream>
#include <list>
#include <stddef.h>
#include <string>
#include <windows.h>

#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/path_service.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/gfx/win/direct_write.h"

#define SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(struct_name, member) \
    offsetof(struct_name, member) + (sizeof static_cast<struct_name*>(0)->member)
#define NONCLIENTMETRICS_SIZE_PRE_VISTA \
    SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(NONCLIENTMETRICS, lfMessageFont)

namespace content {

namespace {

    bool SetupFonts()
    {
        // Load Ahem font.
        // AHEM____.TTF is copied to the directory of DumpRenderTree.exe by
        // WebKit.gyp.
        base::FilePath base_path;
        PathService::Get(base::DIR_MODULE, &base_path);
        base::FilePath font_path = base_path.Append(FILE_PATH_LITERAL("/AHEM____.TTF"));

        const char kRegisterFontFiles[] = "register-font-files";
        // DirectWrite sandbox registration.
        base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess();
        command_line.AppendSwitchASCII(kRegisterFontFiles,
            base::WideToUTF8(font_path.value()));

        return true;
    }

} // namespace

bool CheckLayoutSystemDeps()
{
    std::list<std::string> errors;

    // This metric will be 17 when font size is "Normal".
    // The size of drop-down menus depends on it.
    if (::GetSystemMetrics(SM_CXVSCROLL) != 17)
        errors.push_back("Must use normal size fonts (96 dpi).");

    // Check that we're using the default system fonts.
    OSVERSIONINFO version_info = { 0 };
    version_info.dwOSVersionInfoSize = sizeof(version_info);
    ::GetVersionEx(&version_info);
    bool is_vista_or_later = (version_info.dwMajorVersion >= 6);
    NONCLIENTMETRICS metrics = { 0 };
    metrics.cbSize = is_vista_or_later ? sizeof(NONCLIENTMETRICS)
                                       : NONCLIENTMETRICS_SIZE_PRE_VISTA;
    bool success = !!::SystemParametersInfo(
        SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0);
    CHECK(success);
    LOGFONTW* system_fonts[] = { &metrics.lfStatusFont, &metrics.lfMenuFont, &metrics.lfSmCaptionFont };
    const wchar_t* required_font = is_vista_or_later ? L"Segoe UI" : L"Tahoma";
    int required_font_size = is_vista_or_later ? -12 : -11;
    for (size_t i = 0; i < arraysize(system_fonts); ++i) {
        if (system_fonts[i]->lfHeight != required_font_size || wcscmp(required_font, system_fonts[i]->lfFaceName)) {
            errors.push_back(is_vista_or_later
                    ? "Must use either the Aero or Basic theme."
                    : "Must use the default XP theme (Luna).");
            break;
        }
    }

    for (std::list<std::string>::iterator it = errors.begin(); it != errors.end();
         ++it) {
        std::cerr << *it << "\n";
    }
    return errors.empty();
}

bool BlinkTestPlatformInitialize()
{
    return SetupFonts();
}

} // namespace content
